package com.cy.java;

import org.junit.Test;

import java.util.ArrayList;

/**
 * Collection接口：单列集合，用来存储一个一个的对象
 *      List接口，存储有序的，可重复的数据，-->“动态”数组，替换原有的数组
 *          ArrayList List接口的主要实现类，线程不安全的，效率高，底层使用Object[] elementDate存储
 *          LinkedList 对于频繁的插入和删除操作，使用此类效率比ArrayList效率高，底层使用双向链表存储
 *          Vector 作为List接口的古老实现类，线程安全，效率低，底层使用Object[] elementDate存储
 *
 * ArrayList的源码分析：
 * 1.jdk7中的情况下
 *      ArrayList list = new ArrayList();底层创建了长度是10的Object[]数组
 *      List.add(123);
 *      ...
 *      List.add(11);如果此次添加导致底层数组容量不够，则扩容。
 *      默认情况下，扩容为原来的容量的1.5倍，同时需要将原来的数组中的数据复制到新的数组中
 *
 *      结论：建议开发中使用带参的构造器，Arraylist list = new ArrayList(int capacity);
 *  2.jdk8中的变化
 *       ArrayList list = new ArrayList();底层Object[] elementData初始化为｛｝；并没有创建长度
 *
 *       list.add(123);第一次调用add()时，底层才创建长度为10的数组，并将数据添加到elmentData中
 *       后续的添加和扩容与jdk7无异。
 *
 *  LinkedList源码分析：
 *      LinkedList list = new LinkedList();内部声明了Node类型的first和last属性，默认值为null
 *      list.add(123);将123封装到Node中，创建了Node对象
 *
 *
 *
 * 面试题：ArrayList,LinkedList,Vector三者的异同？
 * 同：三个类都是实现了List接口，存储数据的特点相同，存储有序的，可重复的数据
 * 不同：见上
 *
 *
 * 5.List接口中的常用方法
 */
public class ListTest {
   /* void add(int index, Object ele): 在index 位置插入ele 元素
boolean addAll(int index, Collection eles): 从index 位置开始将eles中 中
            的所有元素添加进来
Object get(int index): 获取指定index 位置的元素
int indexOf(Object obj): 返回obj 在集合中首次出现的位置
int lastIndexOf(Object obj): 返回obj 在当前集合中末次出现的位置
Object remove(int index): 移除指定index 位置的元素，并返回此元素
Object set(int index, Object ele): 设置指定index 位置的元素为ele
List subList(int fromIndex, int toIndex): 返回从fromIndex 到toIndex
    位置的子集合
    */
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",20));
        list.add(456);

        System.out.println(list);

        //插入
        list.add(1,"BB");
        System.out.println(list);
        System.out.println(list.size());//长度

        int index = list.indexOf(456);
        System.out.println(index);
    }


}
